#!/usr/bin/env python3
"""
新旧ArucoTracker对比示例

本示例展示了重构前后ArucoTracker的使用差异：
1. 旧方式：使用回调函数注册
2. 新方式：使用线程和read_frame接口
"""

import sys
import os
import time
import threading

# 添加模块路径
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
sys.path.insert(0, parent_dir)

from aruco_tracker import ArucoTracker, ArucoMarker


def old_style_callback(frame, frame_info, camera_instance):
    """
    旧方式的回调函数（已弃用）
    
    Args:
        frame: 图像帧
        frame_info: 帧信息
        camera_instance: 相机实例
    """
    print("警告：使用了旧式回调函数")


def new_style_callback(tracker):
    """
    新方式的回调函数
    
    Args:
        tracker: ArucoTracker实例
    """
    stats = tracker.get_tracking_statistics()
    print(f"新方式 - FPS: {stats['fps']:.1f}, 跟踪: {stats['tracked_markers']}/{stats['total_markers']}")


def demonstrate_old_style():
    """
    演示旧方式的使用（已弃用，仅作对比）
    """
    print("\n=== 旧方式演示（已弃用） ===")
    print("旧方式直接使用HikCamera的回调函数注册机制")
    print("这种方式不够稳定，已被弃用")
    
    # 注意：旧方式的代码已经被重构，这里只是展示概念
    print("旧方式的特点：")
    print("- 直接使用 camera.set_callback_function()")
    print("- 在回调函数中处理图像")
    print("- 依赖于相机驱动的稳定性")
    print("- 难以控制处理线程")


def demonstrate_new_style():
    """
    演示新方式的使用
    """
    print("\n=== 新方式演示 ===")
    print("新方式使用独立线程和read_frame接口")
    
    # 创建ArucoTracker实例
    calibration_file = "../calibration/camera_params_20250715_203926.json"
    tracker = ArucoTracker(
        camera_index=0,
        calibration_file=calibration_file,
        max_lost_frames=30
    )
    
    # 创建标记（使用默认的滑动窗口大小5）
    marker = ArucoMarker("demo_marker", 0, 50.0)
    tracker.register_marker(marker)
    
    # 设置回调函数
    tracker.set_callback(new_style_callback)
    
    print("新方式的特点：")
    print("- 使用独立的跟踪线程")
    print("- 通过read_frame主动获取图像")
    print("- 线程安全的数据访问")
    print("- 更好的错误处理和控制")
    print("- 可以随时检查跟踪状态")
    
    try:
        # 开始跟踪
        print("\n开始跟踪...")
        if tracker.start_tracking():
            print("跟踪启动成功")
            
            # 等待跟踪开始
            if tracker.wait_for_tracking_start():
                print("跟踪线程已启动")
                
                # 运行一段时间
                for i in range(10):
                    if tracker.is_tracking_active():
                        print(f"跟踪状态检查 {i+1}/10: 运行中")
                        time.sleep(1)
                    else:
                        print("跟踪已停止")
                        break
                
            else:
                print("跟踪启动超时")
        else:
            print("跟踪启动失败")
            
    except Exception as e:
        print(f"新方式演示错误: {e}")
    finally:
        tracker.stop_tracking()
        print("新方式演示结束")


def compare_features():
    """
    对比新旧方式的特性
    """
    print("\n=== 特性对比 ===")
    
    comparison = [
        ("特性", "旧方式", "新方式"),
        ("---", "---", "---"),
        ("稳定性", "依赖相机驱动回调", "独立线程，更稳定"),
        ("线程安全", "否", "是"),
        ("错误处理", "难以处理", "完善的错误处理"),
        ("控制能力", "有限", "完全控制"),
        ("状态检查", "不支持", "支持实时状态检查"),
        ("资源管理", "依赖相机驱动", "主动管理"),
        ("调试难度", "困难", "容易"),
        ("性能开销", "较低", "略高但可控"),
    ]
    
    for row in comparison:
        print(f"{row[0]:<12} | {row[1]:<20} | {row[2]:<20}")


def main():
    """
    主函数
    """
    print("=== ArucoTracker 新旧方式对比 ===")
    
    # 展示特性对比
    compare_features()
    
    # 演示旧方式（概念性）
    demonstrate_old_style()
    
    # 演示新方式
    demonstrate_new_style()
    
    print("\n=== 总结 ===")
    print("新方式的优势：")
    print("1. 更稳定的图像获取机制")
    print("2. 完善的线程安全保护")
    print("3. 更好的错误处理和恢复")
    print("4. 实时状态监控能力")
    print("5. 更灵活的控制接口")
    print("\n推荐使用新方式进行ArUco标记跟踪！")


if __name__ == "__main__":
    main()
